Numpy 基础
参考: https://www.numpy.org.cn/ 或 numpy docs
numpy 是一个 C 实现的计算库, 开源且性能优异, 是众多科学库的依赖
ndarray 向量/线性方程组运算
- 数组点积 dot (对应元素相乘)
- 向量点积 vdot
- 数组内积 inner
- 数组矩阵积 matmul
- 数组行列式 determinant
- 求解线性矩阵方程 solve
- 计算逆矩阵 inv
ndarray 底层是 C 实现, 所以要求数据类型一致
1 | import numpy ad np |
查看函数的使用方法, 鼠标在括号内, Mac 按 Command, Win 按 Alt 查看帮助.
ndarray 的属性
- shape 形状
- ndim 维度
- dtype 数据类型
- itemsize 数据大小(dtype 数据类型占空间字节数)
- size 数组长度(多少个数)
创建 ndarray 并填充初始值
np.zeros(shape)
使用 0 填充np.ones(shape)
使用 1 填充np.empty(shape)
创建但是不赋初始值np.full(shape, value)
使用自定义填充np.arange(count).reshape(shape)
创建一个指定数量的一维数组, 重新改写形状
类似的有 ones_like()
, empty_like()
, zeros_like()
, full_like()
使用 ndarray 替代 shape 参数
np.random.randint(low, high, size)
随机整数范围 [low, high)np.random.random(size)
随机浮点数 [0,1)
基本用法
索引(逗号)与切片(冒号)
- v = np.arange(start, end, step)
- v[x,y], v[start:end:step]
[:]
指的是该维度上的所有, [...]
表示所有其他维度
数组做 nd 的下标
使用一维或多维数组做 nd 的下标, 相当于将 nd 的值放到数组的对应位置
a[[1,2,5]]
取 a 中 id 为 1,2,5 的元素组成新 nd,a[[1,2,5]] = [1,1,1]
可以赋值给 nd arraya[[1,2,5]] += 1
可以对 nd array 运算
在一维数组 a 中取值 a[x], 在多维数组 b 中取值 b[x, y] 其中 x,y 都是目标形状的数组
- a 的 x 可以是一维也可以多维, 就是把 a 对应位置的值填到数组中
布尔数组 做 nd 的下标
值为 True/False 的数组
b = a > 0
所有为真的位置为 Truea[a<0] = 0
将所有 < 0 的标记为 True, 又将下标 True 的值置位 0
切片的区别
list [:]
切片创建指针数据副本(还指向源数据,修改时指向新数据)
nd [:]
切片指向原内存修改原数据改变, nd [id]
索引创建数据副本修改原数据不变
广播
维度不同, 后缘维度轴长相同: (x,y) vs. (y,z)
维度相同, 其中有一个轴为 1: (x,y,1,v) vs. (x,1,u,v)
np.broadcast_to(dt, shape)
根据条件配置进行广播np.expand_dims(dt, axis)
在指定轴上拓展一个长度为 1 的维度np.squeeze(dt)
删除长度为 1 的轴, 降维
矩阵的变换
- 转置(行变列)
dt.T
或np.transpose(dt, axes)
, 默认是将 shape 反过来 - 翻转(基于轴镜像)
np.flip(dt, axis)
- 交换(两个轴交换)
np.swapaxes(dt, src, tar)
- 滚动(轴滚动到轴前)
np.rollaxis(dt, id, before)
拼接与分割
拼接
np.concatenate((a,b), axis)
指定方向维度拼接np.hstake((a,b))
或np.r_[a,b]
horizon, row 拼接np.vstake((a,b))
或np.c_[a,b]
vertical, column 拼接
分割
np.split(a, count)
平均切成几段np.split(a, [id, id...])
在指定位置切分成几段np.hsplit(a, count)
row 分割np.vsplit(a, count)
column 分割
检索元素
np.argmax(a)
最大值所在位置np.argmin(a)
最小值所在位置np.where(cond)
符合条件的元素 id 列表np.where(cond, True 填充默认原值, False 填充默认 0)
a[np.where(cond)]
基于条件选择下标
IO 操作
1 | dt = np.array() |